<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>第一章：Langchain基础</title>
    <link rel="stylesheet" href="../shared_styles.css">
</head>
<body>
    <div class="container">
        <h1>第一章：Langchain基础</h1>

        <section id="1-1">
            <h2>1.1 Langchain是什么？</h2>
            <p>Langchain是一个开源框架，旨在帮助开发者更轻松地构建基于大型语言模型（LLMs）的应用程序。你可以把它想象成一个工具箱，里面装满了用于处理语言模型、连接不同数据源以及创建复杂工作流的各种工具和组件。</p>
            <p>随着GPT等大型语言模型的兴起，开发者们发现虽然这些模型本身非常强大，但在实际应用中，往往需要将它们与其他系统、数据和服务集成起来，才能发挥最大的价值。Langchain正是为了解决这个问题而诞生的，它提供了一套标准化的接口和可组合的模块，大大简化了LLM应用的开发流程。</p>
        </section>

        <section id="1-2">
            <h2>1.2 为什么使用Langchain？</h2>
            <p>使用Langchain有诸多好处，主要包括：</p>
            <ul>
                <li><strong>模块化设计：</strong> Langchain将LLM应用的常见功能抽象为独立的模块（如Models, Prompts, Chains, Agents, Memory, Indexes等），这些模块可以像乐高积木一样灵活组合，构建出各种复杂的应用。</li>
                <li><strong>标准化接口：</strong> 它为不同的LLM提供商（如OpenAI, Hugging Face, Azure等）提供了统一的接口，使得开发者可以轻松切换和尝试不同的模型，而无需大幅修改代码。</li>
                <li><strong>丰富的组件生态：</strong> Langchain拥有庞大的社区和不断增长的组件库，包括各种预置的链、代理、工具和数据加载器，可以加速开发进程。</li>
                <li><strong>数据感知与代理能力：</strong> Langchain不仅仅是调用LLM，它还能让LLM连接到外部数据源（如数据库、API、文件系统），并赋予LLM使用工具（如搜索引擎、计算器、代码执行器）的能力，从而创建出能够与环境交互并自主决策的智能代理。</li>
                <li><strong>简化复杂工作流：</strong> 对于需要多步骤推理、信息检索或与其他服务交互的复杂任务，Langchain提供了强大的链（Chains）和代理（Agents）机制来管理这些工作流。</li>
                <li><strong>提升开发效率：</strong> 通过提供高级抽象和实用工具，Langchain可以显著减少样板代码，让开发者更专注于应用的核心逻辑。</li>
            </ul>
        </section>

        <section id="1-3">
            <h2>1.3 Langchain的核心组件介绍</h2>
            <p>Langchain的核心功能围绕以下几个关键组件构建：</p>
            
            <div class="mermaid">
                graph TD
                A[用户输入] --> B(Prompts)
                B --> C{Models}
                C --> D[Chains]
                D --> E[Agents]
                E --> F[Tools]
                C --> G[Memory]
                D --> H[Indexes]
                H --> I[外部数据]
                F --> J[API/函数]
                G --> K[历史交互]
                style A fill:#f9f,stroke:#333
                style B fill:#bbf,stroke:#333
                style C fill:#f96,stroke:#333
                style D fill:#6f9,stroke:#333
                style E fill:#9cf,stroke:#333
                style F fill:#fc9,stroke:#333
                style G fill:#c9f,stroke:#333
                style H fill:#9fc,stroke:#333
            </div>
            
            <p><strong>核心组件交互关系：</strong></p>
            <table class="component-table">
                <tr>
                    <th>组件</th>
                    <th>功能</th>
                    <th>依赖组件</th>
                </tr>
                <tr>
                    <td><strong>Models</strong></td>
                    <td>对接各类语言模型</td>
                    <td>Prompts, Memory</td>
                </tr>
                <tr>
                    <td><strong>Prompts</strong></td>
                    <td>优化模型输入</td>
                    <td>-</td>
                </tr>
                <tr>
                    <td><strong>Chains</strong></td>
                    <td>组合多个组件</td>
                    <td>Models, Prompts, Memory</td>
                </tr>
                <tr>
                    <td><strong>Agents</strong></td>
                    <td>自主决策执行</td>
                    <td>Chains, Tools</td>
                </tr>
                <tr>
                    <td><strong>Memory</strong></td>
                    <td>存储交互历史</td>
                    <td>-</td>
                </tr>
                <tr>
                    <td><strong>Indexes</strong></td>
                    <td>管理外部数据</td>
                    <td>Chains</td>
                </tr>
                <tr>
                    <td><strong>Tools</strong></td>
                    <td>扩展功能接口</td>
                    <td>Agents</td>
                </tr>
            </table>
            
            <p>组件详细说明：</p>
            <ul>
                <li><strong>Models (模型):</strong> Langchain与各种语言模型交互的接口，支持：
                    <ul>
                        <li><strong>LLMs</strong>: 通用文本输入/输出模型</li>
                        <li><strong>Chat Models</strong>: 对话场景专用模型</li>
                        <li><strong>Text Embedding Models</strong>: 文本向量化模型</li>
                    </ul>
                </li>
                <li><strong>Prompts (提示):</strong> 优化模型输入的组件：
                    <ul>
                        <li><strong>Prompt Templates</strong>: 动态提示模板</li>
                        <li><strong>Example Selectors</strong>: 少样本学习支持</li>
                        <li><strong>Output Parsers</strong>: 结构化输出解析</li>
                    </ul>
                </li>
                <li><strong>Chains (链):</strong> 组合多个组件构建工作流</li>
                <li><strong>Indexes/Retrieval (索引/检索):</strong> 实现RAG的关键组件</li>
                <li><strong>Memory (记忆):</strong> 支持有状态应用</li>
                <li><strong>Agents (代理):</strong> 自主决策执行组件</li>
                <li><strong>Callbacks (回调):</strong> 执行过程监控和扩展</li>
            </ul>
            <p>我们将在后续章节中详细探讨这些组件的用法和原理。</p>
        </section>

        <section id="1-4">
            <h2>1.4 安装和配置Langchain环境</h2>
            
            <h3>1.4.0 环境最佳实践</h3>
            <p><strong>强烈建议使用虚拟环境：</strong></p>
            <pre><code># 创建虚拟环境
python -m venv langchain-env

# 激活环境 (Linux/Mac)
source langchain-env/bin/activate

# 激活环境 (Windows)
langchain-env\Scripts\activate</code></pre>
            
            <p><strong>依赖管理：</strong></p>
            <pre><code># 创建requirements.txt
echo "langchain>=0.1.0" > requirements.txt
echo "langchain-openai" >> requirements.txt
echo "python-dotenv" >> requirements.txt

# 安装依赖
pip install -r requirements.txt</code></pre>
            
            <h3>1.4.1 安装Langchain核心库</h3>
            <p>基础安装命令：</p>
            <pre><code>pip install langchain</code></pre>
            <p>安装Langchain核心功能。</p>

            <h3>1.4.2 安装特定集成</h3>
            <p>Langchain通过各种集成包来支持不同的LLM提供商、数据存储、工具等。例如，如果你想使用OpenAI的模型，你需要安装相关的集成包：</p>
            <pre><code>pip install langchain-openai</code></pre>
            <p>如果你想使用Hugging Face Hub上的模型：</p>
            <pre><code>pip install langchain-huggingface</code></pre>
            <p>如果你需要处理特定类型的文件，比如PDF，你可能需要安装相关的文档加载器依赖：</p>
            <pre><code>pip install pypdf</code></pre>
            <p>Langchain的文档通常会指明使用特定组件时需要安装哪些额外的包。一个常见的做法是根据你的需求安装一组常用的包：</p>
            <pre><code>pip install langchain langchain-openai langchain-community langchain-huggingface python-dotenv beautifulsoup4 pypdf faiss-cpu tiktoken</code></pre>
            <ul>
                <li><code>langchain-community</code>: 包含许多社区贡献的集成和组件。</li>
                <li><code>python-dotenv</code>: 用于管理环境变量（如API密钥）。</li>
                <li><code>beautifulsoup4</code>: 用于网页内容抓取和解析。</li>
                <li><code>pypdf</code>: 用于加载PDF文档。</li>
                <li><code>faiss-cpu</code>: 一个流行的向量数据库，用于高效的相似性搜索 (CPU版本)。如果你有GPU并想使用GPU版本，可以安装 <code>faiss-gpu</code>。</li>
                <li><code>tiktoken</code>: OpenAI用于计算token数量的库。</li>
            </ul>
            
            <h3>1.4.3 配置API密钥</h3>
            <p>API密钥安全最佳实践：</p>
            <ol>
                <li>创建<code>.env</code>文件保存密钥：</li>
                <pre><code># .env 文件内容
DASHSCOPE_API_KEY="your_api_key_here"</code></pre>
                
                <li>在代码中安全加载：</li>
                <pre><code class="language-python">from dotenv import load_dotenv
load_dotenv()  # 从.env加载环境变量

import os
api_key = os.getenv("DASHSCOPE_API_KEY")</code></pre>
                
                <li>Git忽略设置（.gitignore）：</li>
                <pre><code># 确保.gitignore包含
.env
__pycache__/
*.pyc</code></pre>
            </ol>
            
            <div class="warning">
                <p><strong>安全警告：</strong></p>
                <ul>
                    <li>❌ 永远不要硬编码API密钥</li>
                    <li>❌ 不要将.env文件提交到版本控制</li>
                    <li>✅ 使用环境变量管理敏感信息</li>
                    <li>✅ 定期轮换API密钥</li>
                </ul>
            </div>

            <h3>1.4.4 验证安装与问题排查</h3>
            <p><strong>简单验证脚本：</strong></p>
            <pre><code class="language-python"># validate_langchain.py
import langchain
print(f"Langchain版本: {langchain.__version__}")

try:
    from langchain.llms import FakeListLLM
    responses = ["Langchain安装成功!"]
    llm = FakeListLLM(responses=responses)
    print(llm("测试"))
except ImportError:
    print("错误：无法导入Langchain模块")</code></pre>
            
            <p><strong>常见问题解决方案：</strong></p>
            <table class="troubleshooting">
                <tr>
                    <th>问题现象</th>
                    <th>可能原因</th>
                    <th>解决方案</th>
                </tr>
                <tr>
                    <td>ModuleNotFoundError</td>
                    <td>依赖未安装</td>
                    <td>检查requirements.txt，重新安装依赖</td>
                </tr>
                <tr>
                    <td>API连接失败</td>
                    <td>密钥错误/网络问题</td>
                    <td>验证密钥有效性，检查网络连接</td>
                </tr>
                <tr>
                    <td>版本冲突</td>
                    <td>依赖库版本不兼容</td>
                    <td>创建新的虚拟环境，重新安装</td>
                </tr>
            </table>
            
            <h3>1.4.5 第一个Langchain应用</h3>
            <pre><code class="language-python">from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage

# 初始化模型 (使用DashScope)
llm = ChatOpenAI(
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    model="qwen-plus"
)

# 创建对话
messages = [HumanMessage(content="Langchain是什么？")]
response = llm.invoke(messages)

print("AI回复:", response.content)</code></pre>
            <p>运行此脚本将获得关于Langchain的简介，验证环境配置正确。</p>
        </section>

        <div class="navigation">
            <a href="../langchain_tutorial_outline.html">返回目录</a>
            <!-- 后续章节的链接可以在这里添加 -->
        </div>
    </div>
</body>
</html>
